home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 41
/
Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso
/
Aminet
/
comm
/
misc
/
ClipWatch.lha
/
ClipWatch
/
Sources
/
trsii.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-12-29
|
23KB
|
867 lines
/*
PROTOCOLE TRSII
Pour dialoguer avec les télétransmissions CLIP / FORCE (Constructeur WIT)
http://www.wit.fr
Marc Le Douarain , Décembre 1998
mavati@club-internet.fr
http://perso.club-internet.fr/mavati
http://www.multimania.com/mavati
Dernière mise à jour : 29 décembre 2000
*/
void Mem_FreeAll(void)
{
if (Ress!=NULL)
{
free(Ress);
Ress=NULL;
}
if (Jrnl!=NULL)
{
free(Jrnl);
Jrnl=NULL;
}
if (MessagesBoxMemZone!=NULL)
{
free(MessagesBoxMemZone);
MessagesBoxMemZone=NULL;
}
if(TrameRecue!=NULL)
{
free(TrameRecue);
TrameRecue=NULL;
}
}
void Mem_AllocAll(void)
{
int i;
Ress=(struct Ressources *)malloc(sizeof(struct Ressources)*NBR_RESSOURCES);
if (Ress==NULL)
{
ErrorMessageRequest("Could not alloc enough memory (for ressources)");
exit(0);
}
Jrnl=NULL;
MessagesBoxMemZone=(char *)malloc(sizeof(char)*256*NBR_MESSAGESBOX);
if (MessagesBoxMemZone==NULL)
{
ErrorMessageRequest("Could not alloc enough memory (for MessagesBox)");
Mem_FreeAll();
exit(0);
}
for (i=0;i<NBR_MESSAGESBOX;i++)
{
MessagesBox[i]=&MessagesBoxMemZone[i*255];
}
TrameRecue=(char *)malloc(10000);
if (TrameRecue==NULL)
{
ErrorMessageRequest("Could not alloc enough memory (for ReceptFrame)");
Mem_FreeAll();
exit(0);
}
}
/* ########################################## */
/* # Sauvegarde/Lecture des fichiers traces # */
/* ########################################## */
/* Sauvegarde sur disque de la trace */
/* --------------------------------- */
void save_trace_to_disk(char * Fichier,char * TrameTrace,int LgtTrameTrace)
{
FILE * FTrace;
time_t TimeLastSampleSaved;
int PeriodSample;
time_t TimeLastSampleRecup;
time_t TimeSampleRecupBalayage;
int NbrSamplesBalayage;
int i;
char * PtrTrame;
char * CharTmp;
struct tm DateEnClair;
int AnneesDepuis1900;
// char DateEnClairSAS[6];
// int AnneePourSAS;
DateEnClair.tm_sec = 00; /* seconds after the minute */
DateEnClair.tm_min = 00; /* minutes after the hour */
DateEnClair.tm_hour = 00; /* hours since midnight */
DateEnClair.tm_mday = 1; /* day of the month */
DateEnClair.tm_mon = 1; /* months since January */
DateEnClair.tm_year = 78; /* years since 1900 */
DateEnClair.tm_isdst = 0; /*1;*/ /* Daylight Savings Time flag */
TimeLastSampleSaved=mktime(&DateEnClair);
/* Trace en fonctionnement ? */
CharTmp=(str_field(TrameTrace,LgtTrameTrace,4,'\t'));
if (CharTmp[0]='M')
{
/* On regarde si le fichier existe ... valeur de l'horodate du dernier échantillon sauvé */
FTrace=fopen(Fichier,"rb");
if (FTrace)
{
fseek(FTrace,-(sizeof(int)+sizeof(double)),SEEK_END);
fread(&TimeLastSampleSaved,sizeof(time_t),1,FTrace);
fclose(FTrace);
}
/* Valeur de l'horodate du dernier échantillon récupéré */
/* Dernières versions de Clip (>v45?) renvoie l'année sur 4 chiffres directement !!!*/
AnneesDepuis1900 = atoi(str_field(TrameTrace,LgtTrameTrace,8,'\t'));
if (AnneesDepuis1900>1900)
AnneesDepuis1900 = AnneesDepuis1900 - 1900;
DateEnClair.tm_hour = atoi(str_field(TrameTrace,LgtTrameTrace,9,'\t'));
DateEnClair.tm_min = atoi(str_field(TrameTrace,LgtTrameTrace,10,'\t'));
DateEnClair.tm_sec = atoi(str_field(TrameTrace,LgtTrameTrace,11,'\t'));
DateEnClair.tm_mday = atoi(str_field(TrameTrace,LgtTrameTrace,6,'\t'));
DateEnClair.tm_mon = atoi(str_field(TrameTrace,LgtTrameTrace,7,'\t')) - 1;
DateEnClair.tm_year = (char)AnneesDepuis1900;
DateEnClair.tm_isdst = 0; /*1;*/
TimeLastSampleRecup=mktime(&DateEnClair);
/* Nbr de secondes entre chaque échantillon */
{
char * Ptr = str_field(TrameTrace,LgtTrameTrace,5,'\t');
PeriodSample=atoi(Ptr+1);
}
/* Vérification échantillonnage plus récent */
if (TimeLastSampleRecup>TimeLastSampleSaved)
{
/* Balayage en arrière pour trouver l'échantillon à-partir d'où on effectuera le collage */
PtrTrame=str_field(TrameTrace,LgtTrameTrace,13,'\t');
TimeSampleRecupBalayage=TimeLastSampleRecup;
NbrSamplesBalayage=1;
do
{
TimeSampleRecupBalayage=TimeSampleRecupBalayage-PeriodSample;
/* Recherche du champ suivant contenant le nouvel échantillon */
do
{
PtrTrame++;
}while (*PtrTrame!='\t');
PtrTrame++;
NbrSamplesBalayage++;
}
while( (*PtrTrame!='\0') && (*(PtrTrame+1)!=13) && (PtrTrame<(TrameTrace+LgtTrameTrace)) && (TimeSampleRecupBalayage>TimeLastSampleSaved) );
/* Correction du fait qu'on a le dernier échantillon de pointé trop loin */
if (NbrSamplesBalayage>1)
{
NbrSamplesBalayage--;
/* Recherche du champ précédent */
PtrTrame--;
do
{
PtrTrame--;
}while(*PtrTrame!='\t');
}
/* Sauvegarde des nouveaux échantillons */
FTrace=fopen(Fichier,"ab");
if (FTrace)
{
for (i=1;i<=NbrSamplesBalayage;i++)
{
double ValSample;
/* On revient sur le champ précédent */
do
{
PtrTrame--;
}while(*PtrTrame!='\t');
/* Sauvegarde de l'horodate de l'échantillon */
TimeSampleRecupBalayage=TimeSampleRecupBalayage+PeriodSample;
fwrite(&TimeSampleRecupBalayage,sizeof(time_t),1,FTrace);
/* Sauvegarde de la valeur de l'échantillon */
ValSample=atof(PtrTrame+1);
fwrite(&ValSample,sizeof(double),1,FTrace);
}
fclose(FTrace);
}
}
}
}
/* ######################################## */
/* # Calculating the checksum of a string # */
/* # with the protocol TRSII # */
/* ######################################## */
unsigned int calcul_checksum_trsii(char * string,int Lgt)
{
unsigned int chk=0;
int i;
for(i=0;i<Lgt;i++)
{
chk=chk+string[i];
}
chk=chk&63;
if (chk==0)
{
chk=64;
}
chk=64-chk;
chk=chk+64;
return chk;
}
/* ########################################## */
/* # Creating a TRSII request to send # */
/* # and saving which request was requested # */
/* ########################################## */
int send_request_trsii(char * CurRequestStr,int * CurRequestLgt,char * QuestStr,char * Param1Str,char * Param2Str,unsigned long * MemoTimeLaunchReq, int * TimeOutMaxi)
{
int RequeteOk=FALSE;
char TrameEnvoi[64];
int LgtParam1;
int LgtParam2;
LgtParam1=strlen(Param1Str);
LgtParam2=strlen(Param2Str);
/* REQUEST 'ACCES' 'Password' */
/*----------------------------*/
if (strcmp(QuestStr,"ACCES")==0)
{
/* !!!!!!!!!!!!!!!!!!!!!! METTRE LA TRAME COMPLETE DANS CurRequestStr... (pour ETAT servira à
!!!!!!!!!!!!!!!!!!!!!! savoir si 1 ou 2 params demandés !!!!!!!!!!!!
+ réenvoi trame sur time-out!!!!
*/
strcpy(TrameEnvoi,"ACCES\t");
strcpy(TrameEnvoi+6,Param1Str);
TrameEnvoi[6+LgtParam1]='\t';
TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
*TimeOutMaxi=3;
RequeteOk=TRUE;
}
/* REQUETE 'IDENT?' */
/*------------------*/
if (strcmp(QuestStr,"IDENT?")==0)
{
strcpy(TrameEnvoi,"IDENT?\t");
TrameEnvoi[7]=calcul_checksum_trsii(TrameEnvoi,7);
strcpy(TrameEnvoi+8,"\n\0");
*TimeOutMaxi=3;
RequeteOk=TRUE;
}
/* REQUETE 'ETAT?' '1ère ressource' ['nbr de ressources'] */
/*---------------------------------------------------------*/
if (strcmp(QuestStr,"ETAT?")==0)
{
strcpy(TrameEnvoi,"ETAT?\t");
strcpy(TrameEnvoi+6,Param1Str);
TrameEnvoi[6+LgtParam1]='\t';
TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
*TimeOutMaxi=3;
RequeteOk=TRUE;
}
/* REQUETE 'RESS?' '1ère ressource' ['nbr de ressources'] */
/*---------------------------------------------------------*/
if (strcmp(QuestStr,"RESS?")==0)
{
strcpy(TrameEnvoi,"RESS?\t");
strcpy(TrameEnvoi+6,Param1Str);
TrameEnvoi[6+LgtParam1]='\t';
TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
*TimeOutMaxi=4;
RequeteOk=TRUE;
}
/* REQUETE 'TP?' '1ère trace' ['nbr de traces'] */
/*----------------------------------------------*/
if (strcmp(QuestStr,"TP?")==0)
{
strcpy(TrameEnvoi,"TP?\t");
strcpy(TrameEnvoi+4,Param1Str);
TrameEnvoi[4+LgtParam1]='\t';
TrameEnvoi[4+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,4+LgtParam1+1);
strcpy(TrameEnvoi+4+LgtParam1+2,"\n\0");
*TimeOutMaxi=4;
RequeteOk=TRUE;
}
/* REQUETE 'T?' 'n° de la trace' ['nbr d'échantillons à récupérer']*/
/*-----------------------------------------------------------------*/
if (strcmp(QuestStr,"T?")==0)
{
strcpy(TrameEnvoi,"T?\t");
strcpy(TrameEnvoi+3,Param1Str);
TrameEnvoi[3+LgtParam1]='\t';
TrameEnvoi[3+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,3+LgtParam1+1);
strcpy(TrameEnvoi+3+LgtParam1+2,"\n\0");
*TimeOutMaxi=30;
RequeteOk=TRUE;
}
/* REQUETE 'MESS?' 'n° de la boite aux lettres' */
/*-----------------------------------*/
if (strcmp(QuestStr,"MESS?")==0)
{
strcpy(TrameEnvoi,"MESS?\t");
strcpy(TrameEnvoi+6,Param1Str);
TrameEnvoi[6+LgtParam1]='\t';
TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
*TimeOutMaxi=20;
RequeteOk=TRUE;
}
/* REQUETE 'DATE?' */
/*-----------------*/
if (strcmp(QuestStr,"DATE?")==0)
{
strcpy(TrameEnvoi,"DATE?\t");
TrameEnvoi[6]=calcul_checksum_trsii(TrameEnvoi,6);
strcpy(TrameEnvoi+7,"\n\0");
*TimeOutMaxi=3;
RequeteOk=TRUE;
}
/* REQUETE 'TIME?' */
/*-----------------*/
if (strcmp(QuestStr,"TIME?")==0)
{
strcpy(TrameEnvoi,"TIME?\t");
TrameEnvoi[6]=calcul_checksum_trsii(TrameEnvoi,6);
strcpy(TrameEnvoi+7,"\n\0");
*TimeOutMaxi=3;
RequeteOk=TRUE;
}
/* REQUETE 'J?' ['#xxxxxx:N°Evenement'] ou [AAAAMMJJHHMMSS:DateHeure]
/!\ CLIP uniquement : lecture du journal */
/*-------------------------------------------*/
if (strcmp(QuestStr,"J?")==0)
{
strcpy(TrameEnvoi,"J?\t");
if(LgtParam1>0)
{
strcpy(TrameEnvoi+3,Param1Str);
TrameEnvoi[3+LgtParam1]='\t';
TrameEnvoi[3+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,3+LgtParam1+1);
strcpy(TrameEnvoi+3+LgtParam1+2,"\n\0");
}
else
{
TrameEnvoi[3]=calcul_checksum_trsii(TrameEnvoi,3);
strcpy(TrameEnvoi+4,"\n\0");
}
*TimeOutMaxi=5;
RequeteOk=TRUE;
}
/* AUTRE... (Par-exemple Forçage mode TRSII 'ESC'W06) /!\ Pas-de réponse attendue */
if (strcmp(QuestStr,"OTHER")==0)
{
strcpy_limited(TrameEnvoi,Param1Str,LgtParam1);
RequeteOk=TRUE;
}
if (RequeteOk==TRUE)
{
/* On mémorise la requête fraichement crée + sa longueur */
/* En cas d'erreur de Checksum/TimeOut, on la renverra... */
strcpy_limited(CurRequestStr,TrameEnvoi,strlen(TrameEnvoi)+1);
*CurRequestLgt=strlen(TrameEnvoi)+1;
/* Mémorisation de l'heure à laquelle on va lancer la requête pour le 'time-out' */
*MemoTimeLaunchReq=get_timer_secs();
/* Envoie la requête au port série */
Serial_Write(SerialIO,TrameEnvoi,strlen(TrameEnvoi));
}
else
{
if(MoniteurActif)
printf("Unknown request in TRSII send\n");
hangup_modem();
TeletransOnLine=FALSE;
}
}
/* ############################# */
/* # Receiving a TRSII request # */
/* ############################# */
int receive_request_trsii(char * CurRequestStr,int CurRequestLgt,unsigned long *MemoLaunchTime,int * Attemps,char * Trame,int * LgtTrame,int TimeOutToLook)
{
int ReponseOk=FALSE;
int TraitementReponseExistant=FALSE;
int DemandeReenvoi=FALSE;
int TrameComplete;
char *ExtracChamp;
char NbrEnChaine[16];
int StatutRecu;
int StatutNotError;
int NumRess;
char LibelleRessource[LGT_LIBELLE_RESS];
char EtatRessource[LGT_ETAT_RESS];
char carac;
int i;
TrameComplete=Serial_StringCompose(10,Trame,LgtTrame,MemoLaunchTime,TimeOutToLook);
/* Trame complète reçue */
if (TrameComplete==TRUE)
{
StatutRecu=0;
StatutNotError=TRUE;
/* MESSAGE RECU 'STATUT' */
if (strcmp_limited(Trame,"STATUT",6)==0)
{
TraitementReponseExistant=TRUE;
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
StatutRecu=atoi(NbrEnChaine);
StatutNotError=FALSE;
switch(StatutRecu)
{
/* Erreur de checksum */
case 130: DemandeReenvoi=TRUE;
if (MoniteurActif)
printf("Erreur checksum envoyé par la télétrans\n");
break;
/* Accès interdit */
case 132: hangup_modem();
ErrorMessageRequest("ACCES INTERDIT!!!");
TeletransOnLine=FALSE;
break;
/* Err.Parametre */
case 133:
if (strcmp_termnotnull(CurRequestStr,"TP?",13,9)==0)
{
StatutNotError=TRUE;
}
break;
/* OK */
case 0: StatutNotError=TRUE;
break;
/* FIN */
case 1: StatutNotError=TRUE;
break;
/* AUTRE... */
default:
if (MoniteurActif)
printf("Erreur n°%d renvoyée par la télétrans\n",StatutRecu);
}
}
/* Pas reçu de statut d'erreur ? */
if (StatutNotError)
{
/* VERIFICATION DU CHECKSUM POUR LA TRAME RECUE */
if (calcul_checksum_trsii(Trame,*LgtTrame-3)!=Trame[*LgtTrame-3])
{
if (MoniteurActif)
{
printf("Détection erreur de checksum\n");
printf("Checksum attendu:%d\n",calcul_checksum_trsii(Trame,*LgtTrame-3));
}
DemandeReenvoi=TRUE;
}
else
{
/* REQUEST 'ACCES' 'Password' */
/*----------------------------*/
if (strcmp_termnotnull(CurRequestStr,"ACCES",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (str_pos(Trame,*LgtTrame,"OK",2)!=NULL)
{
ReponseOk=TRUE;
}
}
/* REQUEST 'IDENT?' */
/*------------------*/
if (strcmp_termnotnull(CurRequestStr,"IDENT?",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (strcmp_limited(Trame,"IDENT=",6)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(Teletrans.SiteName,ExtracChamp,13,9);
}
ExtracChamp=str_field(Trame,*LgtTrame,4,'\t');
if (ExtracChamp!=NULL)
{
strcpy(Teletrans.Type,"INCONNU");
Teletrans.TRSII_Extended_Clip=FALSE;
Teletrans.NumRessourcesMax=100;
Teletrans.NumTracesMax=0;
if (strcmp_termnotnull(ExtracChamp,"2A",13,9)==0)
{
strcpy(Teletrans.Type,"CLIP");
Teletrans.TRSII_Extended_Clip=TRUE;
Teletrans.NumRessourcesMax=255;
Teletrans.NumTracesMax=72;
}
if (strcmp_termnotnull(ExtracChamp,"29",13,9)==0)
{
strcpy(Teletrans.Type,"CLIP NANO");
Teletrans.TRSII_Extended_Clip=TRUE;
Teletrans.NumRessourcesMax=40;
Teletrans.NumTracesMax=12;
}
if (strcmp_termnotnull(ExtracChamp,"24",13,9)==0)
{
strcpy(Teletrans.Type,"FORCE X");
}
if (strcmp_termnotnull(ExtracChamp,"27",13,9)==0)
{
strcpy(Teletrans.Type,"FORCE PLUS");
Teletrans.NumRessourcesMax=128;
}
if (strcmp_termnotnull(ExtracChamp,"26",13,9)==0)
{
strcpy(Teletrans.Type,"FORCE MINI");
Teletrans.NumRessourcesMax=36;
}
}
ExtracChamp=str_field(Trame,*LgtTrame,3,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(Teletrans.Version,ExtracChamp,13,9);
}
ReponseOk=TRUE;
RefreshType=RFH_IDENTITE;
}
}
/* REQUETE 'ETAT?' '1ère ressources' ['nbr de ressources'] */
/*---------------------------------------------------------*/
if (strcmp_termnotnull(CurRequestStr,"ETAT?",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (strcmp_limited(Trame,"ETAT=",5)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,4,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(EtatRessource,ExtracChamp,13,9);
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
NumRess=atoi(NbrEnChaine);
strcpy(Ress[NumRess].Etat,EtatRessource);
ReponseOk=TRUE;
RefreshType=RFH_ETAT_RESS;
RefreshParam=NumRess;
}
}
}
}
/* REQUETE 'RESS?' '1ère ressources' ['nbr de ressources'] */
/*---------------------------------------------------------*/
if (strcmp_termnotnull(CurRequestStr,"RESS?",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (strcmp_limited(Trame,"RESS=",5)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,6,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(LibelleRessource,ExtracChamp,13,9);
/* Suppression des espaces en fin de chaine */
i=strlen(LibelleRessource);
if (i>0)
{
i--;
do
{
carac=LibelleRessource[i];
if (carac==32)
{
LibelleRessource[i]=0;
}
i--;
}
while((carac==32)&&(i>0));
}
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
NumRess=atoi(NbrEnChaine);
strcpy(Ress[NumRess].Libelle,LibelleRessource);
ReponseOk=TRUE;
RefreshType=RFH_LIBELLE_RESS;
RefreshParam=NumRess;
}
}
}
}
/* REQUETE 'TP?' 'Numéro de la trace' */
/*------------------------------------*/
if (strcmp_termnotnull(CurRequestStr,"TP?",13,9)==0)
{
TraitementReponseExistant=TRUE;
/* Plus de trace ? : STATUS 133 Err.Parametre */
if (StatutRecu==133)
{
ReponseOk=TRUE;
RefreshType=RFH_PARAM_TRACE;
RefreshParam=0; // indique qu'il ne faut plus lire les traces suivantes
}
else
{
if (strcmp_limited(Trame,"TP=",3)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
/* Récupération du n° de trace depuis trame envoyée */
/* => si trace non paramétrée, trame réponse vide... */
ExtracChamp=str_field(CurRequestStr,CurRequestLgt,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
NumRess=atoi(NbrEnChaine);
}
/* Trace non paramétrée ? */
if ( (Trame[5])== 13) // 'CR'
{
strcpy(Param_Trace,"");
Tra[NumRess].Used='A';
}
else
{
char *StrTraceOffset;
/* Servira à la sauvegarde sur disque */
strcpy_limited(Param_Trace,Trame+4,*LgtTrame-8);
Param_Trace[*LgtTrame-9]=0;
/* Ecriture dans la structure */
Tra[NumRess].Used='M';
strcpy_termnotnull(Tra[NumRess].NumMenu,Trame+4,9,0);
Tra[NumRess].NumMenu[3]=' ';
Tra[NumRess].NumMenu[4]='-';
Tra[NumRess].NumMenu[5]=' ';
StrTraceOffset=str_field(Trame+4,128,10,9);
if (StrTraceOffset)
{
strcpy_termnotnull(Tra[NumRess].Libelle,StrTraceOffset,9,0);
}
}
ReponseOk=TRUE;
RefreshType=RFH_PARAM_TRACE;
RefreshParam=NumRess;
}
}
}
/* REQUETE 'T?' 'Numéro de la trace' */
/*-----------------------------------*/
if (strcmp_termnotnull(CurRequestStr,"T?",13,9)==0)
{
TraitementReponseExistant=TRUE;
/* Pas de trace paramétrée ? : STATUS 001 FIN */
if (StatutRecu==1)
{
ReponseOk=TRUE;
}
else
{
if (strcmp_limited(Trame,"T=",2)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
char NomFichier[256];
strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
NumRess=atoi(NbrEnChaine);
sprintf(NomFichier,"Sites/%s/Trace%03d",Teletrans.SiteName,NumRess);
save_trace_to_disk(NomFichier,Trame,*LgtTrame);
ReponseOk=TRUE;
RefreshType=RFH_TRACE;
RefreshParam=NumRess;
}
}
}
}
/* REQUETE 'MESS?' 'Numéro de la boite aux lettres' */
/*--------------------------------------------------*/
if (strcmp_termnotnull(CurRequestStr,"MESS?",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (strcmp_limited(Trame,"MESS=",5)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
NumRess=atoi(NbrEnChaine);
ExtracChamp=str_field(Trame,*LgtTrame,3,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(MessagesBox[NumRess],ExtracChamp,13,9);
ReponseOk=TRUE;
RefreshType=RFH_MESSAGEBOX;
RefreshParam=NumRess;
}
}
}
}
/* REQUETE 'DATE?' */
/*-----------------*/
if (strcmp_termnotnull(CurRequestStr,"DATE?",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (strcmp_limited(Trame,"DATE=",5)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(Teletrans.LocalDate,ExtracChamp,13,9);
ReponseOk=TRUE;
RefreshType=RFH_DATE;
}
}
}
/* REQUETE 'TIME?' */
/*-----------------*/
if (strcmp_termnotnull(CurRequestStr,"TIME?",13,9)==0)
{
TraitementReponseExistant=TRUE;
if (strcmp_limited(Trame,"TIME=",5)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
if (ExtracChamp!=NULL)
{
strcpy_termnotnull(Teletrans.LocalTime,ExtracChamp,13,9);
ReponseOk=TRUE;
RefreshType=RFH_TIME;
}
}
}
/* REQUETE 'J?' */
/*--------------*/
if (strcmp_termnotnull(CurRequestStr,"J?",13,9)==0)
{
TraitementReponseExistant=TRUE;
/* Fin du journal ? : Statut 001 FIN */
if (StatutRecu==1)
{
strcpy(Even_Journal,"FIN");
ReponseOk=TRUE;
RefreshType=RFH_JOURNAL;
}
else
{
if (strcmp_limited(Trame,"J=",2)!=0)
{
DemandeReenvoi=TRUE;
}
else
{
strcpy_limited(Even_Journal,Trame+4,*LgtTrame-4);
Even_Journal[*LgtTrame-8]=0;
ReponseOk=TRUE;
RefreshType=RFH_JOURNAL;
}
}
}
if (!(TraitementReponseExistant))
{
ErrorMessageRequest("Pas de traitement implémenté pour la demande envoyée...");
ErrorMessageRequest("Ce programme a planté...bouhhhh...");
exit(30);
}
if (!(ReponseOk))
{
DemandeReenvoi=TRUE;
}
}
}
}
if (ReponseOk==TRUE)
{
strcpy(CurRequestStr,"");
}
/* Time Out */
if (*MemoLaunchTime==NULL)
{
DemandeReenvoi=TRUE;
}
/* Réenvoyer la trame requête car problème dans la réponse ou TimeOut*/
if (DemandeReenvoi==TRUE)
{
*Attemps=*Attemps-1;
/* Il reste des essais ? */
if (*Attemps>0)
{
*MemoLaunchTime=get_timer_secs();
*LgtTrame=0;
if (MoniteurActif)
Print_Monitor("¤",1,0,0);
Serial_Write(SerialIO,CurRequestStr,CurRequestLgt);
}
else
{
/* Trop de merdes, on raccroche */
hangup_modem();
TeletransOnLine=FALSE;
}
}
return ReponseOk;
}